Introduction
Lorem ipsum
Libraries
library(tidyverse)
library(httr)
library(readxl)
library(plotly)
Preprocessing
Import
# embed code from https://data.world/makeovermonday/2021w5
GET("https://query.data.world/s/rnsywm4k4ae3vz2iitu6cg4sww6xbc",
write_disk(tf <- tempfile(fileext = ".xlsx")))
raw <- read_excel(tf)
Refactor columns
data <- raw %>%
select(Year = Year, Country = Area, Source = Variable,
Production = `Generation (TWh)`) %>%
mutate(across(c(Country, Source), factor))
data$Year <- as.integer(data$Year)
Handle Sources
View all Sources
data %>%
group_by(Source) %>%
summarise(Total.TWh = sum(Production))
Define Source types
sources <- list(
fossil = c("Hard Coal", "Lignite", "Gas", "Other fossil"),
renewable = c("Hydro", "Wind", "Solar", "Bioenergy", "Other renewables"),
nuclear = c("Nuclear"),
demand = c("Demand")
)
sources$base <- c(sources$renewable, sources$fossil, sources$nuclear)
Define Source colors
sources$palette <- c("Hard Coal" = "gray10",
"Lignite" = "saddlebrown",
"Gas" = "darkgoldenrod",
"Other fossil" = "darkgray",
"Hydro" = "royalblue",
"Wind" = "deepskyblue",
"Solar" = "gold",
"Bioenergy" = "forestgreen",
"Other renewables" = "springgreen3",
"Nuclear" = "orchid4")
sources$broad.palette <- c("Fossil" = "saddlebrown",
"Nuclear" = "orchid4",
"Renewables" = "forestgreen")
Add Broad Source
data <- data %>%
mutate(Broad.Source = factor(case_when(
Source %in% sources$fossil ~ "Fossil",
Source %in% sources$nuclear ~ "Nuclear",
Source %in% sources$renewable ~ "Renewables"
)))
Filter irrelevant Sources
data <- data %>%
filter(Source %in% c(sources$base, "Demand"))
Handle Countries
View all Countries
data %>%
filter(Source == "Demand") %>%
group_by(Country) %>%
summarise(Total.Production = sum(Production))
Filter irrelevant Countries
data <- data %>%
filter(!Country == "EU-27")
Plots
Prepare theme
theme_update(text = element_text(size = 20, color = "gray81"),
rect = element_rect(fill = "gray14"),
axis.text = element_text(color = "gray48"),
panel.background = element_rect(fill = "gray10"),
panel.grid = element_line(color = "gray15"),
legend.key = element_rect(fill = "gray14")
)
Good news
p <- data %>%
filter(!is.na(Broad.Source)) %>%
group_by(Year, Broad.Source) %>%
summarise(Total.Production = sum(Production), .groups = "drop_last") %>%
ggplot(aes(x = Year, y = Total.Production, color = Broad.Source)) +
geom_line(size = 2) +
scale_color_manual(values = sources$broad.palette) +
theme(legend.position = "bottom") +
labs(title = "Energy generation sources",
subtitle = "EU27+1 countries") +
ylab("Total Generation (TWh)")
p

Static

LS0tCnRpdGxlOiAiRGF0YSBWaXN1YWxpc2F0aW9uIC0gRXVyb3BlIEVuZXJneSBQcm9kdWN0aW9uIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBkYXJrbHkKICAgIGhpZ2hsaWdodDogYnJlZXplZGFyawotLS0KIyB7LnRhYnNldH0KCiMjIEludHJvZHVjdGlvbiAKCkxvcmVtIGlwc3VtCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQojIGtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgb3V0LmhlaWdodD03LCBvdXQud2lkdGg9MTApCmBgYAoKCiMjIyBMaWJyYXJpZXMKCmBgYHtyIGxpYnJhcmllcywgcmVzdWx0cz0naGlkZSd9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGh0dHIpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHBsb3RseSkKYGBgCgojIyBQcmVwcm9jZXNzaW5nIHsudGFic2V0fQoKIyMjIEltcG9ydAoKYGBge3IgaW1wb3J0LCByZXN1bHRzPSdoaWRlJ30KIyBlbWJlZCBjb2RlIGZyb20gaHR0cHM6Ly9kYXRhLndvcmxkL21ha2VvdmVybW9uZGF5LzIwMjF3NQpHRVQoImh0dHBzOi8vcXVlcnkuZGF0YS53b3JsZC9zL3Juc3l3bTRrNGFlM3Z6MmlpdHU2Y2c0c3d3NnhiYyIsIAogICAgd3JpdGVfZGlzayh0ZiA8LSB0ZW1wZmlsZShmaWxlZXh0ID0gIi54bHN4IikpKQpyYXcgPC0gcmVhZF9leGNlbCh0ZikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfSAKcmF3CmBgYAoKIyMjIFJlZmFjdG9yIGNvbHVtbnMKCmBgYHtyfQpkYXRhIDwtIHJhdyAlPiUKICBzZWxlY3QoWWVhciA9IFllYXIsIENvdW50cnkgPSBBcmVhLCBTb3VyY2UgPSBWYXJpYWJsZSwgCiAgICAgICAgIFByb2R1Y3Rpb24gPSBgR2VuZXJhdGlvbiAoVFdoKWApICU+JQogIG11dGF0ZShhY3Jvc3MoYyhDb3VudHJ5LCBTb3VyY2UpLCBmYWN0b3IpKQoKZGF0YSRZZWFyIDwtIGFzLmludGVnZXIoZGF0YSRZZWFyKQpgYGAKCgpgYGB7cn0KZGF0YQpgYGAKCgojIyMgSGFuZGxlIFNvdXJjZXMgey50YWJzZXR9CgojIyMjIFZpZXcgYWxsIFNvdXJjZXMKYGBge3J9CmRhdGEgJT4lCiAgZ3JvdXBfYnkoU291cmNlKSAlPiUKICBzdW1tYXJpc2UoVG90YWwuVFdoID0gc3VtKFByb2R1Y3Rpb24pKQpgYGAKCiMjIyMgRGVmaW5lIFNvdXJjZSB0eXBlcwoKYGBge3J9CnNvdXJjZXMgPC0gbGlzdCgKICBmb3NzaWwgPSBjKCJIYXJkIENvYWwiLCAiTGlnbml0ZSIsICJHYXMiLCAiT3RoZXIgZm9zc2lsIiksCiAgcmVuZXdhYmxlID0gYygiSHlkcm8iLCAiV2luZCIsICJTb2xhciIsICJCaW9lbmVyZ3kiLCAiT3RoZXIgcmVuZXdhYmxlcyIpLAogIG51Y2xlYXIgPSBjKCJOdWNsZWFyIiksCiAgZGVtYW5kID0gYygiRGVtYW5kIikKKQpzb3VyY2VzJGJhc2UgPC0gYyhzb3VyY2VzJHJlbmV3YWJsZSwgc291cmNlcyRmb3NzaWwsIHNvdXJjZXMkbnVjbGVhcikKYGBgCgoKIyMjIyBEZWZpbmUgU291cmNlIGNvbG9ycwoKYGBge3J9CnNvdXJjZXMkcGFsZXR0ZSA8LSBjKCJIYXJkIENvYWwiID0gImdyYXkxMCIsCiAgICAgICAgICAgICAgICAgICAgICJMaWduaXRlIiA9ICJzYWRkbGVicm93biIsCiAgICAgICAgICAgICAgICAgICAgICJHYXMiID0gImRhcmtnb2xkZW5yb2QiLAogICAgICAgICAgICAgICAgICAgICAiT3RoZXIgZm9zc2lsIiA9ICJkYXJrZ3JheSIsCiAgICAgICAgICAgICAgICAgICAgICJIeWRybyIgPSAicm95YWxibHVlIiwKICAgICAgICAgICAgICAgICAgICAgIldpbmQiID0gImRlZXBza3libHVlIiwKICAgICAgICAgICAgICAgICAgICAgIlNvbGFyIiA9ICJnb2xkIiwKICAgICAgICAgICAgICAgICAgICAgIkJpb2VuZXJneSIgPSAiZm9yZXN0Z3JlZW4iLAogICAgICAgICAgICAgICAgICAgICAiT3RoZXIgcmVuZXdhYmxlcyIgPSAic3ByaW5nZ3JlZW4zIiwKICAgICAgICAgICAgICAgICAgICAgIk51Y2xlYXIiID0gIm9yY2hpZDQiKQoKc291cmNlcyRicm9hZC5wYWxldHRlIDwtIGMoIkZvc3NpbCIgPSAic2FkZGxlYnJvd24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVjbGVhciIgPSAib3JjaGlkNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZW5ld2FibGVzIiA9ICJmb3Jlc3RncmVlbiIpCmBgYAoKCiMjIyMgQWRkIEJyb2FkIFNvdXJjZQoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICBtdXRhdGUoQnJvYWQuU291cmNlID0gZmFjdG9yKGNhc2Vfd2hlbigKICAgIFNvdXJjZSAlaW4lIHNvdXJjZXMkZm9zc2lsIH4gIkZvc3NpbCIsCiAgICBTb3VyY2UgJWluJSBzb3VyY2VzJG51Y2xlYXIgfiAiTnVjbGVhciIsCiAgICBTb3VyY2UgJWluJSBzb3VyY2VzJHJlbmV3YWJsZSB+ICJSZW5ld2FibGVzIgogICAgKSkpCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KZGF0YQpgYGAKCgoKCiMjIyMgRmlsdGVyIGlycmVsZXZhbnQgU291cmNlcwoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICBmaWx0ZXIoU291cmNlICVpbiUgYyhzb3VyY2VzJGJhc2UsICJEZW1hbmQiKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpkYXRhCmBgYAoKCgojIyMgSGFuZGxlIENvdW50cmllcyB7LnRhYnNldH0KIyMjIyBWaWV3IGFsbCBDb3VudHJpZXMKYGBge3J9CmRhdGEgJT4lCiAgZmlsdGVyKFNvdXJjZSA9PSAiRGVtYW5kIikgJT4lCiAgZ3JvdXBfYnkoQ291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKFRvdGFsLlByb2R1Y3Rpb24gPSBzdW0oUHJvZHVjdGlvbikpCmBgYAojIyMjIEZpbHRlciBpcnJlbGV2YW50IENvdW50cmllcwoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICBmaWx0ZXIoIUNvdW50cnkgPT0gIkVVLTI3IikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpkYXRhCmBgYAoKCiMjIFBsb3RzIHsudGFic2V0fQoKIyMjIFByZXBhcmUgdGhlbWUKCmBgYHtyfQp0aGVtZV91cGRhdGUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGNvbG9yID0gImdyYXk4MSIpLAogICAgICAgICAgICAgcmVjdCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkxNCIpLAogICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImdyYXk0OCIpLAogICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkxMCIpLAogICAgICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5MTUiKSwKICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5MTQiKQogICAgICAgICAgICAgKQpgYGAKCmBgYHtyfQp0aGVtZV9zZXQodGhlbWVfZ3JheSgpKQpgYGAKCiMjIyBHb29kIG5ld3MKCmBgYHtyLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgb3V0LmhlaWdodD03LCBvdXQud2lkdGg9MTB9CnAgPC0gZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKEJyb2FkLlNvdXJjZSkpICU+JQogIGdyb3VwX2J5KFllYXIsIEJyb2FkLlNvdXJjZSkgJT4lCiAgc3VtbWFyaXNlKFRvdGFsLlByb2R1Y3Rpb24gPSBzdW0oUHJvZHVjdGlvbiksIC5ncm91cHMgPSAiZHJvcF9sYXN0IikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IFRvdGFsLlByb2R1Y3Rpb24sIGNvbG9yID0gQnJvYWQuU291cmNlKSkgKwogIGdlb21fbGluZShzaXplID0gMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBzb3VyY2VzJGJyb2FkLnBhbGV0dGUpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGxhYnModGl0bGUgPSAiRW5lcmd5IGdlbmVyYXRpb24gc291cmNlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJFVTI3KzEgY291bnRyaWVzIikgKwogIHlsYWIoIlRvdGFsIEdlbmVyYXRpb24gKFRXaCkiKQoKcApgYGAKCiMjIyMgey50YWJzZXR9CgojIyMjIyBTdGF0aWMKYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBvdXQuaGVpZ2h0PTcsIG91dC53aWR0aD0xMH0KcApgYGAKCiMjIyMjIEludGVyYWN0aXZlCgpgYGB7ciwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG91dC5oZWlnaHQ9Nywgb3V0LndpZHRoPTEwfQpnZ3Bsb3RseShwKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK